package com.core.ingenium.view.epadilla;


import com.core.ingenium.model.CarreraNivel;
import com.core.ingenium.model.Estudiante;
import com.core.ingenium.model.JavaServiceFacadeEPadilla;

import java.io.FileNotFoundException;
import java.io.Serializable;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.ViewHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import oracle.adf.view.rich.component.rich.RichPopup;
import oracle.adf.view.rich.component.rich.input.RichInputFile;

import org.apache.myfaces.trinidad.event.SelectionEvent;
import org.apache.myfaces.trinidad.model.UploadedFile;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class EstudianteController implements Serializable {
    
    private JavaServiceFacadeEPadilla service;
    private List<Estudiante> lstEstudiante;
    private List<CarreraNivel> lstCarreraNivel;
    private Estudiante editable;
    private Estudiante estudiante;
    private Estudiante filtro;
    
    private String paginaSiguiente;
    private String error = "";
    private String colorError;
    
    private boolean seleccionado;
    private RichPopup popConfirmar;
    private RichPopup popLista;
    private List<Estudiante> lstEstudianteNoRegistrados;
    
    private UploadedFile estudianteFile;
    private UIComponent inputFile;
    private List<Estudiante> lstEstudianteExcel;
    
    public EstudianteController() {
        service = new JavaServiceFacadeEPadilla();
        this.setEditable(new Estudiante());
        this.setEstudiante(new Estudiante());
        this.setFiltro(new Estudiante());
        
        this.setPaginaSiguiente("");
        this.setError("");
        this.setColorError("");
        
        this.setSeleccionado(false);
        this.setLstEstudianteNoRegistrados(new ArrayList<Estudiante>());
        this.setLstEstudianteExcel(new ArrayList<Estudiante>());
        
        try{
            this.setLstEstudiante(service.getEstudianteFindAll());
            this.setLstCarreraNivel(service.getCarreraNivelFindAll());
        }catch(Exception e){
            colorError = "rgb(231,0,0)";
            error = "** El servicio no se encuentra disponible.";
        }    
    }
    
    public String buscarEstudiante() {
        try {
            this.setLstEstudiante(service.getEstudianteFindByFiltro(filtro));
        } catch (Exception e) {
            colorError = "rgb(231,0,0)";
            error = "** El servicio no se encuentra disponible.";
        }
        return null;
    }

    public void seleccionar(SelectionEvent selectionEvent) {
        int row = (Integer) selectionEvent.getAddedSet().iterator().next();
        editable = lstEstudiante.get(row);
        seleccionado = true;
    }

    public String agregarEstudiante() {
        nuevo();
        seleccionado = false;
        editable.setCarreraNivel(new CarreraNivel());
        paginaSiguiente = "MantenimientoEstudiante";
        limpiarError();
        return paginaSiguiente;
    }

    public String eliminarEstudiante() {
        if(!editable.getPendiente()){
            try{
                service.removeEstudiante(editable);
                colorError = "rgb(8,167,213)";
                error = "** El estudiante fue eliminado exitosamente.";
                paginaSiguiente = "ListarEstudiante";
            }catch(Exception e){
                colorError = "rgb(231,0,0)";
                error = "** El servicio no se encuentra disponible.";
                paginaSiguiente = "ListarEstudiante";
            }
        }else{
            colorError = "rgb(231,0,0)";
            error = "** El estudiante no puede ser eliminado.";
            paginaSiguiente = "ListarEstudiante";
        }
        refrescar();
        ocultarConfirmacion();
        return paginaSiguiente;
    }

    public String modificarEstudiante() {
        if(seleccionado){
            limpiarError();
            paginaSiguiente = "MantenimientoEstudiante";
        }else{
            colorError = "rgb(231,0,0)";
            error = "** Debe seleccionar un estudiante.";
            paginaSiguiente = "ListarEstudiante";
        }
        return paginaSiguiente;
    }
    
    public String registrarEstudiante() {
        if(seleccionado){
            try{
                
                CarreraNivel cn = service.getCarreraNivelFindById(editable.getCarreraNivel());
                editable.setCarreraNivel(cn);

                try{
                    service.mergeEstudiante(editable);
                }catch(Exception ex){
                    service.mergeEstudiante(editable);   
                }                
                
                colorError = "rgb(8,167,213)";
                error = "** El estudiante fue modificado exitosamente.";
                paginaSiguiente = "ListarEstudiante";
                refrescar();
                
            }catch(Exception e){
               colorError = "rgb(231,0,0)";
               error = "** El servicio no se encuentra disponible.";
               paginaSiguiente = "MantenimientoEstudiante";
            }
        }else if(existeEstudiante()){
            colorError = "rgb(231,0,0)";
            error = "El estudiante ya se encuentra registrado.";
            paginaSiguiente = "MantenimientoEstudiante";
            }else{
                try{
                    editable.setLstEstudiantePlantilla(null);
                    service.persistEstudiante(editable);
                    colorError = "rgb(8,167,213)";
                    error = "** El estudiante fue registrado exitosamente.";
                    paginaSiguiente = "ListarEstudiante";
                    refrescar();
                }catch(Exception e){
                   colorError = "rgb(231,0,0)";
                   error = "** El servicio no se encuentra disponible.";
                   paginaSiguiente = "MantenimientoEstudiante";
                }
            }
        return paginaSiguiente;
    }
    
    private boolean existeEstudiante(){
        boolean existe = false;
        
        try{
            lstEstudiante = service.getEstudianteFindAll();
        }catch(Exception e){
            colorError = "rgb(231,0,0)";
            error = "** El servicio no se encuentra disponible.";
            paginaSiguiente = "MantenimientoEstudiante";
        }
        
        for(Estudiante e:lstEstudiante){
            if(editable.getIdentificacion().equals(e.getIdentificacion())){
                existe = true;
            }else{
                existe = false;
            }
        }
        return existe;
    }
    

    public String regresar() {
        nuevo();
        limpiarError();
        refrescar();
        paginaSiguiente = "ListarEstudiante";
        return paginaSiguiente;
    }
    
    private void nuevo(){
        editable = new Estudiante();
    }
    
    private void limpiarError(){
        error = "";
    }
    
    public String refrescar() {
        seleccionado = false;
        try {
            this.setLstEstudiante(service.getEstudianteFindAll());
        } catch (Exception e) {
            colorError = "rgb(231,0,0)";
            error = "** El servicio no se encuentra disponible.";
        }   
        return paginaSiguiente;
    }
    
    public String mostrarConfirmacion(){
        if(seleccionado){
            RichPopup.PopupHints ph = new RichPopup.PopupHints();
            popConfirmar.show(ph);
        }else{
            colorError = "rgb(231,0,0)";
            error = "** Debe seleccionar un estudiante.";
            paginaSiguiente = "ListarEstudiante";
        }
        return paginaSiguiente;
    }
    
    public void ocultarConfirmacion(){
        popConfirmar.hide();
    }
    
    
    public String mostrarPopLista(){
        RichPopup.PopupHints ph = new RichPopup.PopupHints();
        popLista.show(ph);
        return paginaSiguiente;
    }
    
    public void ocultarPopLista(){
        popLista.hide();
    }
    
    
    public String updateEstudiante(ValueChangeEvent valueChangeEvent) {
        
        RichInputFile inputFileComponent = (RichInputFile)valueChangeEvent.getComponent();
        UploadedFile newFile = (UploadedFile)valueChangeEvent.getNewValue();
        UploadedFile oldFile = (UploadedFile)valueChangeEvent.getOldValue();
        
        if(newFile.getFilename().endsWith(".xls")){
            
            POIFSFileSystem fs;
            try {
                fs = new POIFSFileSystem(newFile.getInputStream());
                HSSFWorkbook wb = new HSSFWorkbook(fs);
                HSSFSheet sheet =wb.getSheet("lista");
                RowProcessor ip = ExcelProcessor.getInstance();
                this.setLstEstudianteExcel(ip.processEstudiante(sheet));
                
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
            }
        }else{
            error ="El archivo excel debe ser formato .xls";
        }
        
       
        refrescar();
        return null;
    }
    
    private String refresh(){
         FacesContext fc = FacesContext.getCurrentInstance();
         String refreshpage = fc.getViewRoot().getViewId();
         ViewHandler ViewH = fc.getApplication().getViewHandler();
         UIViewRoot UIV = ViewH.createView(fc, refreshpage);
         UIV.setViewId(refreshpage);
         fc.setViewRoot(UIV);
         return null;
    }
    
    
    //setters
    public void setLstEstudiante(List<Estudiante> lstEstudiante) {this.lstEstudiante = lstEstudiante;}
    public void setEditable(Estudiante editable) {this.editable = editable;}
    public void setEstudiante(Estudiante estudiante) {this.estudiante = estudiante;}
    public void setFiltro(Estudiante filtro) {this.filtro = filtro;}
    public void setPaginaSiguiente(String paginaSiguiente) {this.paginaSiguiente = paginaSiguiente;}
    public void setError(String error) {this.error = error;}
    public void setColorError(String colorError) {this.colorError = colorError;}
    public void setSeleccionado(boolean seleccionado) {this.seleccionado = seleccionado;}
    public void setLstCarreraNivel(List<CarreraNivel> lstCarreraNivel) {this.lstCarreraNivel = lstCarreraNivel;}
    public void setPopConfirmar(RichPopup popConfirmar) {this.popConfirmar = popConfirmar;}
    public void setLstEstudianteNoRegistrados(List<Estudiante> lstEstudianteNoRegistrados) {this.lstEstudianteNoRegistrados = lstEstudianteNoRegistrados;}
    public void setPopLista(RichPopup popLista) {this.popLista = popLista;}
    
    //getters
    public List<Estudiante> getLstEstudiante() {return lstEstudiante;}
    public Estudiante getEditable() {return editable;}
    public Estudiante getEstudiante() {return estudiante;}
    public Estudiante getFiltro() {return filtro;}
    public String getPaginaSiguiente() {return paginaSiguiente;}
    public String getError() {return error;}
    public String getColorError() {return colorError;}
    public boolean isSeleccionado() {return seleccionado;}
    public List<CarreraNivel> getLstCarreraNivel() {return lstCarreraNivel;}
    public RichPopup getPopConfirmar() {return popConfirmar;}
    public List<Estudiante> getLstEstudianteNoRegistrados() {return lstEstudianteNoRegistrados;}
    public RichPopup getPopLista() {return popLista;}

    public void setEstudianteFile(UploadedFile estudianteFile) {
        this.estudianteFile = estudianteFile;
    }

    public UploadedFile getEstudianteFile() {
        return estudianteFile;
    }

    public void setInputFile(UIComponent inputFile) {
        this.inputFile = inputFile;
    }

    public UIComponent getInputFile() {
        return inputFile;
    }

    public void setLstEstudianteExcel(List<Estudiante> lstEstudianteExcel) {
        this.lstEstudianteExcel = lstEstudianteExcel;
    }

    public List<Estudiante> getLstEstudianteExcel() {
        return lstEstudianteExcel;
    }
}
